package Git2024_5_11;

public class Spring2 {
    /**
     * SpringBean对象的
     * 单实例 Singleton
     *      创建IoC容器时创建的实例对象
     * 多实例 prototype
     *      产生区别 创建对象的时机不同-创建IoC容器时创建对象的话数量无法确定 因为涉及到内存的损耗
     *      因此 在创建IoC容器创建时 只是读取了Bean的定义信息
     *       后期请求获取Bean对象时 再实时创建相应数量的实例对象
     * 标签 @Scope("指定单例或多例")
     * 未指定注入 默认为单实例的 整个应用中只有一个实例对象 多实例则每次请求都会创建一个独立的对象
     *
     * 应用场景
     *  单例模式适用于需要共享数据并且需要避免重复创建实例的情况
     *  而多例模式适用于需要动态地创建对象并提供独立实例的情况
     */
    /**
     * Bean对象的生命周期
     * 程序中的每个对象都有生命周期 包括: 创建 初始化 应用 销毁
     *  1.实例化阶段
     *   分配资源 分配空间
     *   通过无参构造完成
     *
     *  2.属性赋值阶段(依赖注入)
     *   若无数据会赋初始值
     *   容器会将Bean中的属性值注入到Bean中
     *   通过set方法
     *
     *  3.初始化阶段
     *   在属性注入完成后 Bean对象初始化操作 ---能进行干预拦截 方便进行其他操作--
     *
     *  4.使用阶段
     *   初始化后 Bean就可以被容器使用了
     *   context.getBean(Xxx.class)方法获取对象进行操作
     *
     *  5.销毁阶段
     *   容器在关闭时会对所有Bean进行销毁操作 释放资源 ---能进行干预拦截 方便进行其他操作--
     *
     * 在其生命周期中能进行干预拦截 方便进行其他操作
     * 例如初始化阶段加上注解@PostConstruct 进行拦截 进行前置性的操作 执行完后Bean周期才能继续下放
     * 例如销毁之前 加上@preDestroy 进行拦截 进行销毁前的其他工作 如断开流的连接等操作
     */
    //Post前缀 表示在..之后
    //Pre前缀 表示在..之前
    /**
     * 应用场景
     *  初始化
     *    1.创建数据库连接
     *    2.加载资源文件
     *    3.进行数据校验
     *  销毁
     *    1.断开数据库连接
     *    2.保存数据
     *    3.释放占用的资源
     */

    /**
     * 引用外部属性文件 -> 自动扫描
     * 步骤
     *  1.创建一个(配置)文件---一般在resources中配置(工程创建时一般自动创建一个空的.properties文件)
     *      后缀一般为:Xxx.properties(固定格式: username = Xxx password = Xxx 较为方便)
     *                              注意: = 两边不要加空格
     *               Xxx.xml(以标签进行操作)
     *               Xxx.yml
     *               Xxx.yaml
     *  2.在xxx.properties中 定义数据库连接的URL地址,用户名,密码信息
     *  3.Java类中,引入外部属性文件,并使用相关的配置信息
     */
    //注意: 配置文件中赋值时 "=" 两边不要加空格
    /*
        在类上引入外部文件名 借用注解
        @PropertySource(value = "classpath:配置文件名.后缀") 引入外部属性文件 需要指定外部属性文件名
            其中 classpath:为固定写法 表示类路径
        引入外部属性文件

        @Value("${外部配置文件的配置名 例如 spring.datasource.password}") 写出具体配置的值
            其中${}为固定写法 用于表示Value规定的值为获取外部文件中的具体配置值
     */

    //需求 在工程启动时 自动扫描所有子包,子类目录 以此实现在启动工程时将所有能被配置的对象存储进IoC容器
    //一般会单独创建一个包 存储所有的配置类
    /**
     * 自动扫描 借用注解
     * @ComponentScan("指定扫描路径")
     * -子需求: 扫描优先级-
     * 使用注解实现
     * @Configuration 属于配置类 工程启动时会优先加载此类
     *  前提: 实现了自动扫描功能才可以使用该注解
     */
}
